% 

mortal(X):-
  person(X).
mortal(X):-
  dead(X).
person(sokrates).
dead(platon).

:- dynamic(breeze/1).
:- dynamic(stench/1).
:- dynamic(agentpos/3).
agentpos(1,1,1).

breezy(X, Y):-
  agentpos(X, Y, T),
  breeze(T).

smelly(X, Y):-
  agentpos(X, Y, T),
  stench(T).

nopit(X, Y):-
  visited(L, Y),
  X is L + 1,
  \+  breezy(L, Y).

nopit(X, Y):-
  visited(R, Y),
  X is R - 1,
  \+  breezy(R, Y).

nopit(X, Y):-
  visited(X, U),
  Y is U - 1,
  \+  breezy(X, U).

nopit(X, Y):-
  visited(X, D),
  Y is D + 1,
  \+  breezy(X, D).

% kuna me kasutame agentpos-i, siis me oskame sealt uusi koordinaate
% tuletada ja legal/1 predikaadiga kontrollida. Alternatiiv oleks Prologile
% lihtsalt ütelda, mis koordinaadid olemas on.
%coord(1).
%coord(2).
%coord(3).
%coord(4).

legal(X):-
  X > 0,
  X < 5.

visited(X, Y):-
  agentpos(X, Y, _).

safe(X, Y):-
  visited(X, Y).

safe(X, Y):-
  nopit(X, Y).
%  nowumpus(X, Y).

ismove(up).
ismove(left).
ismove(right).
ismove(down).


newpos(X, Y, up, T):-
  agentpos(X, D, P),
  Y is D + 1,
  T is P + 1,
  legal(Y).

newpos(X, Y, left, T):-
  agentpos(R, Y, P),
  X is R - 1,
  T is P + 1,
  legal(Y).

newpos(X, Y, right, T):-
  agentpos(L, Y, P),
  X is L + 1,
  T is P + 1,
  legal(Y).

newpos(X, Y, down, T):-
  agentpos(X, U, P),
  Y is U - 1,
  T is P + 1,
  legal(Y).

% küsi järgmist käiku, näit. move(M, 2).
move(M, T):-
  ismove(M),
  newpos(X, Y, M, T),
  safe(X, Y),
  tellkb(agentpos(X, Y, T)).

% anna teada uusi fakte, näit. tellkb(breeze(2)).
tellkb(X):-
  asserta(X).

















